package collectionFrame;

public class Demo1_CollectionDemo {

    /**
     * 集合框架
     *   集合：存放同一种类型数据的一个容器，容器就是集合，每个数据就是一个元素
     *        这种特性数组也有，所以集合是基于数组的
     *   (软件)框架：为了完成某件事情而制定的某种规范，在java的集合框架中所谓的规范就是规定了一些常用的方法
     *
     * 集合有哪些内容(面向接口编程。逐级定义方法规范)
     *   Collection
     *     List
     *       ArrayList
     *       (Vector)
     *       LinkedList
     *       Stack
     *     Set
     *       HashSet
     *       TreeSet
     *     Queue
     *       Deque
     *         ArrayDeque
     *   Map
     *     HashMap
     *     HashTable
     *     TreeMap
     *     *Properties
     *
     * 泛型
     *   含义：规定集合中元素的类型
     *   本质：参数化类型，把类型当做一种参数的形式处理，实参传的是什么类型，形参接收的就是什么类型
     *   位置：类 接口 方法都可以使用泛型  泛型类  泛型接口  泛型方法
     *   原因：
     *    1，保证类型的安全性：定义了一个泛型之后，如果添加其他类型的元素，编译就会报错
     *    2. 消除强制转型：如果使用Object作为泛型，得到的数据必须向下转型
     *   如何使用
     *     1.基本的使用:指定具体的类型作为泛型
     *       List<String> strList = new ArrayList<String>()
     *     2.通用的用法:泛型类 泛型接口 泛型方法
     *       E:Element (一般在集合中使用，表示集合的元素泛型)
     *       T:Type
     *       K:Key (键)
     *       V:Value(值)
     *       N:Number(数值类型)
     *     3.通配的用法:无边界通配符  固定上边界通配符  固定下边界通配符
     *   实现原理
     *     把通用或通配的泛型按照 Object类型进行编译
     *     如果是上边界通配符泛型，按照这个上边界的类型进行编译
     *     .java文件有泛型，编译成.class文件泛型消失的过程叫做 泛型擦除
     *
     * 迭代器
     *   专门做循环使用的一个对象
     *   必须得在一个可循环(迭代)对象(可以使用for循环的)的基础上使用
     *   提供了一种方法访问容器中的各个元素，不需要关心内部的任何细节
     *   可以对任何容器(可迭代对象).iterator(),编程一个迭代器进行遍历
     *   hasNext判断是否有下一个元素，next获取下一个元素内容
     *   一定要避免同时出现多个 next 方法，逻辑容易出错
     *
     * 集合算法类
     *   Collections
     *     为 List 提供的方法都是静态的方法，Collections这个类是个静态类
     *     常用的方法包括：排序，打乱顺序，求最大值最小值，反转，交换等等
     *   Arrays
     *     为数组提供了常用的方法，也是静态类
     *
     * 比较器
     *   关于排序(sort)方法，Collections中的sort最终还是调用了 Arrays 中的 sort 方法
     *   能使用Collections.sort方法作排序的列表的泛型，必须是Comparable接口的子类。在sort方法中已经对泛型做了上边界的类型限定
     *
     *   任何一个参与排序的类都必须实现Comparable接口，泛型是当前类的类型(跟自己的类型做对比)，重写compareTo方法
     *   二次排序：在compareTo方法中使用多个条件同时来判断大小
     *
     *   默认排序规则：长期有效的规则，基本不会发生变化的
     *     在类中实现Comparable接口，重写compareTo方法中定义的排序规则。
     *     在使用Collections.sort的时候并没有显示地指定排序规则，这种就是默认排序规则
     *   自定义排序规则：有特殊情况的时候临时偶然使用一次的规则，用完就结束
     *     在类中实现Comparator接口，重写compare方法中定义的排序规则。
     *     在使用Collections.sort的时候需要把这个自定义类当做第二个参数显示传递，才可以使用
     *
     *   Comparable(E)和Comparator(R)对比
     *     1.E是默认排序规则，R是自定义排序规则
     *     2.E是在当前类中实现Comparable接口，重写compareTo方法
     *       R是单独定义一个类实行Comparator接口，重写compare方法
     *     3.E不需要显示调用，默认使用；R必须在调用的时候显示指定
     *     4.E只能有一个默认规则，R可以有任意多个，但是使用的时候只能用一个
     *     5.如果E和R同时存在的时候，R优先
     *
     * List总结
     *   ArrayList 和 LinkedList 的区别
     *     ArrayList的底层实现结构是数组，有原始容量10，如果容量不够会自动按照1.5倍扩容
     *       ArrayList中的每个元素都有相应的固定位置，用索引表示，所以比较适合做查找操作，但是不适合做添加和删除
     *     LinkedList的底层是链表结构，没有原始容量，每个元素都被封装成一个Node类型，Node类型中有前驱后继和当前元素
     *       利用节点和节点直接前驱和后继的连接形成了一个集合，每个元素都没有固定的位置
     *       所以LinkedList比较适合做添加和删除操作，不适合做查询操作
     *   Stack 可能会问问
     *   ArrayList 和 Vector 的区别
     *   Queue 和 Deque一般不常问
     *
     *
     */

}
